home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / t_os / qa / akn_lib1.c next >
C/C++ Source or Header  |  1993-11-30  |  11KB  |  441 lines

  1. // 茜CDPLAYER(試作版)                /////  Tab Size : 4  /////
  2. //
  3. // akn_lib1.c    v2.0 L21
  4. //
  5. // (C)K.Konishi    18-Jul-93
  6. //
  7.  
  8. #define    MAIN
  9.  
  10. #include "Platform.h"
  11.  
  12. #include "cd.h"
  13. #include <EGB.h>
  14. #include <MOS.h>
  15. #include <CDRFRB.h>
  16. #include <string.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <time.h>
  20. #include <conio.h>
  21. #include <FMCFRB.h>
  22. #include "aoi_lib2.h"
  23.  
  24. #define    INIT_X        250
  25. #define    INIT_Y        150
  26. #define    LEN_X        270
  27. #define    LEN_Y        111
  28. #define    BUTTON_X     16
  29. #define    BUTTON_Y     16
  30.  
  31. //    ON : 1   OFF : 0     aoi_lib1.hより
  32. #define    PAUSE    2
  33.  
  34. AOIbuttonData    AbDc[BUTTON];
  35.  
  36. void _AKANEselectButtonDraw(short sx, short sy, short bx, short by)
  37. {
  38.     short i;
  39.     
  40.     for (i = 0; i < 12; i++) {        // 曲番
  41.         AOIbuttonBase(sx + 5 + (i ? 4 : 0) + i * (bx + 1), sy + by * 5 + 10, (i == 0 || i == 11) ? bx + 4: bx, by);
  42.     }
  43. }
  44.  
  45. void AKANECDbaseDraw(short sx, short sy, short lx, short ly, short bx, short by)
  46. {
  47.     int i;
  48.  
  49.     AOIwinBase(sx, sy, lx, ly, 1);
  50.  
  51.     AOIbuttonBase(sx +  5, sy + 5, bx, by);
  52.     AOIbuttonBase(sx + 22, sy + 5, lx - 27, by);
  53.  
  54.     AOIsystem12Font(sx + 36, sy + 7, BLACK, "CDPLAYER V2.0L21");
  55.     AOIboxFull(sx + 5, sy + by + 6, sx + 146, sy + by * 3 + 7, 8);
  56.     for (i = 0; i <= 1; i++) {    // CD MIC のマーク vol
  57.         AOIbuttonBase(sx + 147, sy + by + 6 +(by + 1)*i, bx, by);
  58.         AOIbuttonBase(sx + 164, sy + by + 6 +(by + 1)*i, lx - 153 - bx, by);
  59.     }
  60.  
  61.     AOIbuttonBase(sx + 5, sy + by * 3 + 8, lx - 10, by);    // 曲目
  62.  
  63.     _AKANEselectButtonDraw(sx, sy, bx, by);                    // 曲番
  64.  
  65.     
  66.     for (i = 0; i <= 1; i++) {        // 特殊play
  67.         AOIbuttonBase(sx + 217, sy + by * 4 + 9 + i * (by + 1), 48, by);
  68.     }
  69.     for (i = 0; i < 7; i++) {        // 操作キー
  70.         AOIbuttonBase(sx + 5 + ((i > 2) ? 23 : 0) + i * 27,
  71.             sy + by * 4 + 9, (i == 2) ? 49 : 26, by);
  72.     }
  73.     AOIsystem12Font(sx + 61, sy + 75, BLACK, "PLAY");    // ボタン描画
  74.     AOIsystem12Font(sx + 198, sy + 75, BLACK, "■");
  75.     AOIsystem12Font(sx + 11, sy + 75, BLACK, "<");
  76.     AOIsystem12Font(sx + 143, sy + 75, BLACK, ">");
  77.     AOIsystem12Font(sx + 116, sy + 75, BLACK, "≫");
  78.     AOIsystem12Font(sx + 170, sy + 75, BLACK, "∥");
  79.     AOIsystem12Font(sx + 218, sy + 92, BLACK, "RAND");
  80. }
  81.  
  82. void AKANECDbuttonSet(void)
  83. {
  84.     AOIsetButton(&AbDc[ 1],   5,   5,  16, 16);
  85.     AOIsetButton(&AbDc[ 2],  22,   5, 243, 16);
  86.     AOIsetButton(&AbDc[ 3], 147,  22,  16, 16);
  87.     AOIsetButton(&AbDc[ 4], 164,  22, 101, 16);
  88.     AOIsetButton(&AbDc[ 5], 147,  39,  16, 16);
  89.     AOIsetButton(&AbDc[ 6], 164,  39, 101, 16);
  90.     AOIsetButton(&AbDc[ 7],   5,  73,  26, 16);
  91.     AOIsetButton(&AbDc[ 8],  32,  73,  26, 16);
  92.     AOIsetButton(&AbDc[ 9],  59,  73,  49, 16);
  93.     AOIsetButton(&AbDc[10], 109,  73,  26, 16);
  94.     AOIsetButton(&AbDc[11], 136,  73,  26, 16);
  95.     AOIsetButton(&AbDc[12], 163,  73,  26, 16);
  96.     AOIsetButton(&AbDc[13], 190,  73,  26, 16);
  97.     AOIsetButton(&AbDc[14], 217,  73,  48, 16);
  98.     AOIsetButton(&AbDc[15],   5,  90,  20, 16);
  99.     AOIsetButton(&AbDc[16], 196,  90,  20, 16);
  100.     AOIsetButton(&AbDc[17], 217,  90,  48, 16);
  101.     AOIsetButton(&AbDc[18],   5,  22,  41, 33);
  102.     AOIsetButton(&AbDc[19],  47,  22, 100, 16);
  103.     AOIsetButton(&AbDc[20],  47,  39, 100, 16);
  104.     AOIsetButton(&AbDc[21],  26,  90,  16, 16);
  105.     AOIsetButton(&AbDc[22],  43,  90,  16, 16);
  106.     AOIsetButton(&AbDc[23],  60,  90,  16, 16);
  107.     AOIsetButton(&AbDc[24],  77,  90,  16, 16);
  108.     AOIsetButton(&AbDc[25],  94,  90,  16, 16);
  109.     AOIsetButton(&AbDc[26], 111,  90,  16, 16);
  110.     AOIsetButton(&AbDc[27], 128,  90,  16, 16);
  111.     AOIsetButton(&AbDc[28], 145,  90,  16, 16);
  112.     AOIsetButton(&AbDc[29], 162,  90,  16, 16);
  113.     AOIsetButton(&AbDc[30], 179,  90,  16, 16);
  114.     AOIsetButton(&AbDc[31],   5,  56, 260, 16);
  115. }
  116.  
  117. void AKANEselectButton(short sx, short sy, short shift, short et, AOIbuttonData *Data)
  118. {
  119.     short i, j = 1;
  120.     char str[10];
  121.     AOIstringData    asD;        // AOIstrData型の変数宣言
  122.     AOIbuttonData     *Dt = Data;    // AOIbuttonData型の変数宣言
  123.     
  124.     if (et == 0) {
  125.         CDopen();
  126.         et = endtrk;
  127.     }
  128.     memoryShift = shift;
  129.     
  130.     asD.sx = 12;
  131.     asD.sy = 12;
  132.     asD.ax =  6;
  133.     asD.ay = 12;
  134.     asD.sc = BLACK;
  135.     asD.ss = 0x01;
  136.     MOS_disp(0);
  137.     _AKANEselectButtonDraw(sx, sy, BUTTON_X, BUTTON_Y);
  138.     for (i = shift;
  139.          i < ((et > shift + 10) ? shift + 10 : et); i++) {
  140.         AOIstring(sx + Dt[20 + j].x + 2, sy + Dt[21].y + 15, &asD, _itoa(j + shift, str, 10));
  141.         j++;
  142.     }
  143.     MOS_disp(1);
  144. }
  145.  
  146. int AKANEcdNowTimeDraw(short sx, short sy, char min, char sec, char frame, char nowPlayTimeDisplay)
  147. {
  148.     short    ret    = 0;
  149.     char    Dmin = 0;
  150.     char    Dsec = 0;
  151.     char    Dfrm = 0;
  152.     
  153.     if (min == 0 && sec == 0 && frame == 0) {
  154.         ret = cdr_mphase(driveno, &status, &nowNo, &nowtrktime, &nowdsktime);
  155.         if (ret != 0) {
  156.             CDinit();
  157.         }
  158.     } else {
  159.         nowtrktime.min   = min;
  160.         nowtrktime.sec   = sec;
  161.         nowtrktime.frame = frame;
  162.         nowdsktime.min   = min;
  163.         nowdsktime.sec   = sec;
  164.         nowdsktime.frame = frame;
  165.     }
  166.     if (nowPlayTimeDisplay == DSK) {
  167.         Dmin = nowdsktime.min;
  168.         Dsec = nowdsktime.sec;
  169.         Dfrm = nowdsktime.frame;
  170.     } else if (nowPlayTimeDisplay == TRK) {
  171.         Dmin = nowtrktime.min;
  172.         Dsec = nowtrktime.sec;
  173.         Dfrm = nowtrktime.frame;
  174.     }
  175.     AOIfigureDraw(sx +  60, sy + 40, (short)Dmin);
  176.     AOIfigureDraw(sx +  90, sy + 40, (short)Dsec - 2);
  177.     AOIfigureDraw(sx + 120, sy + 40, (short)Dfrm);
  178.     return ret;
  179. }
  180.  
  181. void AKANEcdNowNoDraw(short sx, short sy, int memoryNowPlayNo)
  182. {
  183.     int ret;
  184.  
  185.     ret = cdr_mphase(driveno, &status, &nowNo, &nowtrktime, &nowdsktime);
  186.     if (ret != 0) {
  187.         CDinit();
  188.     }
  189.     if (nowNo != memoryNowPlayNo) memoryNowPlayNo = nowNo;
  190.     else return;
  191.     AOIfigureDraw2(sx + 10, sy + 26, nowNo);
  192. }
  193.  
  194. void AKANEfastNext(short sx, short sy)
  195. {
  196.     int ch, mx, my;
  197.     long i = 0;
  198.     long j = 1;
  199.     short ret;
  200.     short music;
  201.     unsigned moji, encode;
  202.     struct TIMEADRS playTime;
  203.     char pat_work[258];
  204.     
  205.     MOS_typeRom(37 + 1, 0, 0, pat_work);    // マウスも変更
  206.     cdr_mphase(driveno, &status, &nowNo, &nowtrktime, &nowdsktime);
  207.     ret = cdr_continue(driveno);
  208.     if ((ret & 0x108) != 0) {            // 一時停止中ではない 
  209.         if (status == 0) music = OFF;    // 停止中
  210.         else music = ON;                // 演奏中
  211.     } else {                            // 一時停止中
  212.         music = PAUSE;
  213.         cdr_pause(driveno);
  214.     }
  215.     if (music == OFF) return;
  216.     do {
  217.         MOS_rdpos(&ch, &mx, &my);
  218.  
  219.         moji = KYB_read(1, &encode);
  220.         if (moji == 0x8009) ch = 1;
  221.         KYB_clrbuf();
  222.         
  223.         nowdsktime.frame += j;
  224.         if (nowdsktime.frame > 70) {
  225.             nowdsktime.sec ++;
  226.             nowdsktime.frame = 0;
  227.         }
  228.         if (nowdsktime.sec > 59) {
  229.             nowdsktime.min++;
  230.             nowdsktime.sec =0;
  231.         }
  232.         AKANEcdNowTimeDraw(sx, sy, nowdsktime.min, nowdsktime.sec, nowdsktime.frame, nowPlayTimeDisplay);
  233.         if (i > 50) {    // フレーム増加の間隔
  234.             i = 0;
  235.             j += 10;    // 早送りのフレーム数
  236.         }
  237.         i++;
  238.     } while (ch == 1);
  239.  
  240.     playTime.min   = nowdsktime.min;
  241.     playTime.sec   = nowdsktime.sec;
  242.     playTime.frame = nowdsktime.frame;
  243.     
  244. //    printf("CDplayTime2呼び出しました%d %d %d", playTime.min, playTime.sec, playTime.frame);
  245.     CDplayTime(&playTime);
  246.     if (music == PAUSE) {
  247.         cdr_pause(driveno);
  248.         cdr_mphase(driveno, &status, &nowNo, &nowtrktime, &nowdsktime);
  249.         AKANEcdNowTimeDraw(sx, sy, nowdsktime.min, nowdsktime.sec, nowdsktime.frame, nowPlayTimeDisplay);
  250.     }
  251. }
  252.  
  253. Boolean AKANEcdplayWork(void)
  254. {
  255.     short sx = INIT_X,   sy = INIT_Y;
  256.     short lx = LEN_X,    ly = LEN_Y;
  257.     short bx = BUTTON_X, by = BUTTON_Y;
  258.     int    ch, mx, my;
  259.     int button = 0;
  260.     int i;
  261.     char endmark = 0;
  262.     short musicShift = 0;
  263.     char buttonLamp = OFF;
  264.     unsigned moji, encode;
  265.     char pat_work[258];
  266.     char dispTmp[(640/8)*480];                //  ドットデータの読み書き作業領域
  267.  
  268.     EGB_resolution(work, 0, 0x43);
  269.     AOIgetGraph(dispTmp, sx, sy, sx + lx + 7, sy + ly + 7);
  270.     
  271.     AKANECDbaseDraw(sx, sy, lx, ly, bx, by);
  272.     AKANECDbuttonSet();
  273.  
  274.     MOS_start(mwork, MosWorkSize);
  275.     MOS_disp(1);
  276.     MOS_typeRom(80 + 1, 0, 0, pat_work);
  277.     
  278.     do {
  279.         MOS_rdpos(&ch, &mx, &my);
  280.         button = 0;
  281.         if (ch == 1) {
  282.             button = AOIbutton(sx, sy, mx, my, AbDc);
  283.             //    printf("%d\r", button);
  284.         }
  285.         moji = KYB_read(1, &encode);
  286.         switch (moji) {
  287.             case 0x8006 :
  288.                 button = 7;
  289.                 break;
  290.             case 0x8007 :
  291.                 button = 8;
  292.                 break;
  293.             case 0x8008 :
  294.                 button = 9;
  295.                 break;
  296.             case 0x8009 :
  297.                 AKANEfastNext(sx, sy);
  298.                 break;
  299.             case 0x800a :
  300.                 button = 11;
  301.                 break;
  302.             case 0x800b :
  303.                 button = 12;
  304.                 break;
  305.             case 0x801d :
  306.                 button = 13;
  307.                 break;
  308.             case 0x31..0x39 :    //    1~9
  309.                 button = moji - 0x30 + 20;
  310.                 break;
  311.             case 0x30 :        //    0
  312.                 button = 30;
  313.                 break;
  314.             case 0x70 :        //    プレー   p
  315.                 button = 9;
  316.                 break;
  317.             case 0x73 :        //    ストップ s
  318.                 button = 13;
  319.                 break;
  320.             case 0x6e :        //    ネクスト n
  321.                 button = 11;
  322.                 break;
  323.             case 0x62 :        //    バック     b
  324.                 button = 7;
  325.                 break;
  326.             case 0x72 :        //    ランダム r
  327.                 button = 17;
  328.                 break;
  329.             case 0x6f :        //    一時停止 o
  330.                 button = 12;
  331.                 break;
  332.             case 0x69 :        //    イントロ i
  333.                 button = 14;
  334.                 break;
  335.             case 0x74 :        //    タイム切り換え t
  336.                 button = 20;
  337.                 break;
  338.             case 0x2d :        //    ダイレクト選曲 - -
  339.                 button = 15;
  340.                 break;
  341.             case 0x2b :        //    ダイレクト選曲 + +
  342.                 button = 16;
  343.                 break;
  344.             case 0x1b :        //    終了  ESC
  345.                 button = 1;
  346.                 break;
  347.             case 0x65 :        //    終了  e
  348.                 button = 1;
  349.                 break;
  350.             case 0x68 :        //    高速モード  h
  351.                 button = 40;
  352.                 break;
  353.             case 0x6c :        //    互換モード  l
  354.                 button = 41;
  355.                 break;
  356.         }
  357.         KYB_clrbuf();
  358.         if (button > 0) {            // ボタン反転
  359.             if (button != 18 && button != 19 && button != 20) {
  360.                 AOIbuttonLamp(sx, sy, &AbDc[button]);
  361.                 buttonLamp = ON;
  362.                 MOS_typeRom(115 + 1, 0, 0, pat_work);    // マウスも変更
  363.                 if (button == 1) {
  364.                     MOS_typeRom(124 + 1, 0, 0, pat_work);
  365.                 }
  366.             }
  367.         }
  368.         if (memoryShift != musicShift) {    // 前回と内容が変更あるとき
  369.             AKANEselectButton(sx, sy, musicShift, endtrk, AbDc);
  370.         }
  371.         
  372.         AKANEcdNowTimeDraw(sx, sy, 0, 0, 0, nowPlayTimeDisplay);
  373.         
  374.         AKANEcdNowNoDraw(sx, sy, memoryNowPlayNo);
  375.         //    printf("\r%s", (status == 1) ? "演奏中" : "停止中");
  376.         switch (button) {
  377.             case  1 :
  378.                 endmark = 1;        // 終了条件設定
  379.                 break;
  380.             case  2 :
  381.                 //    printf("移動");
  382.                 AOIwindowMove(dispTmp, &sx, &sy, lx, ly);
  383.                 break;
  384.             case  7 :
  385.                 CDback();
  386.                 break;
  387.             case  9 :
  388.                 CDplay();
  389.                 break;
  390.             case 10 :
  391.                 AKANEfastNext(sx, sy);
  392.                 break;
  393.             case 11 :
  394.                 CDnext();
  395.                 break;
  396.             case 12 :
  397.                 CDpause();
  398.                 break;
  399.             case 13 :
  400.                 CDstop();
  401.                 break;
  402.             case 15 :
  403.                 if (musicShift > 0) musicShift -= 10;
  404.                 for (i = 0; i < 100000; i++) ;            // 時間調整
  405.                 break;
  406.             case 16 :
  407.                 if (musicShift < endtrk - 10) musicShift += 10;
  408.                 for (i = 0; i < 100000; i++) ;            // 時間調整
  409.                 break;
  410.             case 17 :
  411.                 CDplayNo(_AOIrandom(endtrk));
  412.                 break;
  413.             case 20 :
  414.                 if (nowPlayTimeDisplay == DSK) nowPlayTimeDisplay = TRK;
  415.                 else if (nowPlayTimeDisplay == TRK) nowPlayTimeDisplay = DSK;
  416.                 for (i = 0; i < 100000; i++) ;            // 時間調整
  417.                 break;
  418.             case 21..30 :
  419.                 CDplayNo(button + musicShift - 20);
  420.                 break;
  421.             case 40 :
  422.                 _outp(0x05ec, 1);
  423.                 break;
  424.             case 41 :
  425.                 _outp(0x05ec, 0);
  426.                 break;
  427.         }
  428.         if (buttonLamp == ON) {                            // ボタンの反転
  429.             if (button > 0) {
  430.                 AOIbuttonLamp(sx, sy, &AbDc[button]);
  431.                 buttonLamp = OFF;
  432.                 MOS_typeRom(80 + 1, 0, 0, pat_work);    // マウスも元通り
  433.             }
  434.         }
  435.     } while (endmark != 1);
  436.     MOS_end();
  437.     AOIputGraph(dispTmp, sx, sy, sx + lx + 7, sy + ly + 7);
  438.     
  439.     return TRUE;
  440. }
  441.